package com.sunrise.configuracoes.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.springframework.stereotype.Controller;

import com.sunrise.configuracoes.servico.ManterFilialService;
import com.sunrise.configuracoes.visao.FilialForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.dataModel.UsuarioDataModel;
import com.sunrise.generico.entidade.Cidade;
import com.sunrise.generico.entidade.Endereco;
import com.sunrise.generico.entidade.Estado;
import com.sunrise.generico.entidade.Filial;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.entidade.iface.EntidadeManter;
import com.sunrise.generico.enums.TipoStatus;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.util.WebServiceCep;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterFilialBean extends ManterBean<Filial> {

	@Resource
	@Getter
	private ManterFilialService filialService;

	@Resource
	@Getter
	private FilialForm formulario;

	@Override
	public void inicializarEntidade() {
		setEntidade(new Filial());
		getEntidade().setEndereco(new Endereco());
		getEntidade().getEndereco().setCidade(new Cidade());
		getEntidade().getEndereco().getCidade().setEstado(new Estado());
		getEntidade().setResponsavel(new Usuario());
		getEntidade().setAtivo(Boolean.TRUE);
		setStatus(Arrays.asList(TipoStatus.values()));
		inicializarFormulario();
	}

	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		if (getEntidade().getEndereco() == null) {
			getEntidade().setEndereco(new Endereco());
			getEntidade().getEndereco().setCidade(new Cidade());
			getEntidade().getEndereco().getCidade().setEstado(new Estado());
		} else if (getEntidade().getEndereco().getCidade() == null) {
			getEntidade().getEndereco().setCidade(new Cidade());
		} else if (getEntidade().getEndereco().getCidade().getEstado() == null) {
			getEntidade().getEndereco().getCidade().setEstado(new Estado());
		}
		carregarCidades();
	}

	private void inicializarFormulario() {
		getFormulario().setFisica(Boolean.TRUE);
		getFormulario().setEstados(getFilialService().listarEstados());
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		inicializarEntidade();
		setFiltro(new Filtro());
		getFiltro().setAtivo(getStatus().iterator().next());
		buscarPorFiltros();
	}

	@Override
	public List<Filial> iniciarlizarListEntidade() {
		return new ArrayList<Filial>();
	}

	@Override
	public String alterar() {
		if (getService().validarCampoUnico(getEntidade())) {
			getFilialService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("alteradoSucesso"));
			return getListar();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoExistente"));
		}
		return null;
	}

	@Override
	public String salvar() {
		if (getService().validarCampoUnico(getEntidade())) {
			getFilialService().inserir(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoExistente"));
		}
		return null;
	}
	
	@Override
	public String salvarContinuar() {
		if (getService().validarCampoUnico(getEntidade())) {
			getFilialService().inserir(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
			buscarPorFiltros();
			return criarEntidade();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoExistente"));
		}
		return null;
	}

	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}

	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

	public void buscarPorFiltros() {
		setEntidades(getFilialService().buscarPorFiltros(getFiltro()));
	}

	public List<String> autoCompleteNomeUsuario(String nome) {
		Collection<Usuario> usuarios = getFilialService().listarUsuarioPorNome(nome);
		List<String> listaEntidades = new ArrayList<String>();
		for (EntidadeManter e : usuarios) {
			listaEntidades.add(e.getNome());
		}
		return listaEntidades;

	}

	public List<String> autoCompleteNomeFilial(String nome) {
		Collection<Filial> filiais = getFilialService().listarFilialPorNome(nome);
		List<String> listaEntidades = new ArrayList<String>();
		for (EntidadeManter e : filiais) {
			listaEntidades.add(e.getNome());
		}
		return listaEntidades;

	}

	public List<String> autoCompleteNomeCidade(String nome) {
		Collection<Cidade> cidades = getFilialService().listarCidadePorNome(nome);
		List<String> listaEntidades = new ArrayList<String>();
		for (Cidade e : cidades) {
			listaEntidades.add(e.getNome());
		}
		return listaEntidades;
	}

	public List<String> autoCompleteNomeResponsavel(String nome) {
		Collection<Usuario> usuarios = getFilialService().listarUsuarioPorNome(nome);
		List<String> listaEntidades = new ArrayList<String>();
		for (Usuario e : usuarios) {
			listaEntidades.add(e.getNome());
		}
		return listaEntidades;
	}

	public void buscarUsuariosPorFiltros() {
		getFiltro().setAtivo(TipoStatus.HABILITADO);
		getFormulario().setUsuariosSelecionar(
				new UsuarioDataModel(getFilialService().listarUsuariosPorFiltro(getFiltro())));
	}

	public void buscarResponsavelPorFiltros() {
		getFiltro().setAtivo(TipoStatus.HABILITADO);
		getFormulario().setResponsavelSelecionar(
				new UsuarioDataModel(getFilialService().listarUsuariosPorFiltro(getFiltro())));
	}

	public void adicionarResponsavel() {
		getFormulario().setResponsavelSelecionar(new UsuarioDataModel(new ArrayList<Usuario>()));
	}

	public void adicionarUsuarios() {
		if (getEntidade().getUsuarios() == null) {
			getEntidade().setUsuarios(new ArrayList<Usuario>());
		}
		getEntidade().getUsuarios().addAll(
				getFilialService().adicionarUsuariosSelecionados(getFormulario().getUsuariosSelecionados(),
						getEntidade()));
		getFormulario().setUsuariosSelecionar(new UsuarioDataModel(new ArrayList<Usuario>()));
	}

	public void removerUsuario() {
		getEntidade().getUsuarios().remove(getFormulario().getUsuarioRemover());
	}

	public void consultarCep() {
		if (getEntidade().getEndereco().getCep() != null && !getEntidade().getEndereco().getCep().isEmpty()) {
			WebServiceCep cep = WebServiceCep.searchCep(getEntidade().getEndereco().getCep());
			if (cep != null) {
				getEntidade().getEndereco().setBairro(cep.getBairro());
				getEntidade().getEndereco().setEndereco(cep.getLogradouroType() + " " + cep.getLogradouro());
				getEntidade().getEndereco().setCidade(getFilialService().buscarCidadePorNome(cep.getCidade()));
			}
			carregarCidades();
		}
	}

	public void carregarCidades() {
		if (getEntidade().getEndereco() != null && getEntidade().getEndereco().getCidade() != null
				&& getEntidade().getEndereco().getCidade().getEstado() != null && getEntidade().getEndereco().getCidade().getEstado().getId() != null) {
			getFormulario().setCidades(
					getFilialService().carregarCidadesPorEstado(getEntidade().getEndereco().getCidade().getEstado()));
		}

	}

}
